package cn.walls1717.wallsmall.ware.service;

import cn.walls1717.wallsmall.common.pojo.to.OrderTO;
import cn.walls1717.wallsmall.common.pojo.to.mq.StockLockedTO;
import cn.walls1717.wallsmall.common.utils.PageUtils;
import cn.walls1717.wallsmall.ware.entity.PurchaseDetailEntity;
import cn.walls1717.wallsmall.ware.entity.WareSkuEntity;
import cn.walls1717.wallsmall.ware.pojo.vo.SkuHasStockVO;
import cn.walls1717.wallsmall.ware.pojo.vo.WareSkuLockVO;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;

/**
 * 商品库存
 *
 * @author walls1717
 * @email walls1717@163.com
 * @date 2022-10-21 13:26:06
 */
public interface WareSkuService extends IService<WareSkuEntity> {

    /**
     * 分页条件查询
     *
     * @param params 查询条件
     * @return 分页数据
     */
    PageUtils listPagesByConditions(Map<String, Object> params);

    /**
     * 保存库存，如果库存已存在则增加
     *
     * @param detail 采购信息
     */
    void saveStock(PurchaseDetailEntity detail);

    /**
     * 根据skuId查询sku是否有库存
     *
     * @param skuIds skuId
     * @return sku库存状态
     */
    List<SkuHasStockVO> getHasStock(List<Long> skuIds);

    /**
     * 锁定库存
     *
     * @param stockLock 被锁的sku数据
     * @return 锁定结果
     */
    Boolean orderStockLock(WareSkuLockVO stockLock);

    /**
     * 解锁库存，正常走库存延时队列逻辑。
     *
     * @param stockLockedTO 解锁数据
     */
    void unLockStock(StockLockedTO stockLockedTO);

    /**
     * 解锁库存，订单直接发送到解锁队列。<br>
     * 防止订单服务卡顿，订单状态一致没有改变，库存消息优先到期，查订单状态依然是新建状态，导致库存一直无法解锁。
     *
     * @param order 解锁数据
     */
    void unLockStock(OrderTO order);
}

